@Query অ্যানোটেশন কী?
Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম SQL বা JPQL (Java Persistence Query Language) কোয়েরি লেখা যায়। এটি এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে ডিফল্ট মেথডের মাধ্যমে কাঙ্ক্ষিত ফলাফল পাওয়া সম্ভব নয়। @Query অ্যানোটেশনের মাধ্যমে ডেভেলপাররা সরাসরি জটিল এবং নির্দিষ্ট ডেটা অপারেশনের জন্য কোয়েরি কাস্টমাইজ করতে পারেন।
@Query এর বৈশিষ্ট্য
- JPQL এবং Native Query: @Query অ্যানোটেশনে JPQL (Object-Oriented Query) এবং Native SQL (Raw Query) লেখা সম্ভব।
- প্যারামিটারাইজড কুয়েরি: প্লেসহোল্ডার বা নামযুক্ত প্যারামিটারের মাধ্যমে কোয়েরি আরও নিরাপদ করা যায়।
- কাস্টম ফলাফল: জটিল ডেটা অপারেশনের জন্য কাস্টম কুয়েরি লিখতে ব্যবহার করা হয়।
@Query ব্যবহার করে কাস্টম কুয়েরি লেখার ধাপ
১. সাধারণ কুয়েরি
একটি নির্দিষ্ট নামের প্রোডাক্ট খুঁজে বের করতে @Query ব্যবহার করা যায়:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("SELECT p FROM Product p WHERE p.name = :name")
List<Product> findByName(@Param("name") String name);
}
ব্যবহার:
List<Product> products = productRepository.findByName("Laptop");
products.forEach(System.out::println);
২. Native Query
Native SQL কুয়েরি ব্যবহার করতে nativeQuery প্যারামিটার true করতে হবে:
@Query(value = "SELECT * FROM products WHERE price > :price", nativeQuery = true)
List<Product> findProductsAbovePrice(@Param("price") Double price);
ব্যবহার:
List<Product> products = productRepository.findProductsAbovePrice(50000.0);
products.forEach(System.out::println);
@Query এর মাধ্যমে জটিল কুয়েরি
১. প্রাইসের সীমার মধ্যে প্রোডাক্ট খুঁজে আনা
@Query("SELECT p FROM Product p WHERE p.price BETWEEN :minPrice AND :maxPrice")
List<Product> findProductsInPriceRange(@Param("minPrice") Double minPrice, @Param("maxPrice") Double maxPrice);
ব্যবহার:
List<Product> products = productRepository.findProductsInPriceRange(30000.0, 70000.0);
products.forEach(System.out::println);
২. নাম ও প্রাইসের ভিত্তিতে ফিল্টার
@Query("SELECT p FROM Product p WHERE p.name LIKE %:name% AND p.price < :price")
List<Product> findByNameAndPriceLessThan(@Param("name") String name, @Param("price") Double price);
ব্যবহার:
List<Product> products = productRepository.findByNameAndPriceLessThan("Lap", 80000.0);
products.forEach(System.out::println);
Pagination এবং Sorting সহ @Query
Spring Data JPA-এর পেজিনেশন ও সোর্টিং ফিচার @Query এর সাথে ব্যবহার করা যায়:
@Query("SELECT p FROM Product p WHERE p.price > :price")
Page<Product> findProductsWithPagination(@Param("price") Double price, Pageable pageable);
ব্যবহার:
Pageable pageable = PageRequest.of(0, 5, Sort.by("price").ascending());
Page<Product> productPage = productRepository.findProductsWithPagination(40000.0, pageable);
productPage.getContent().forEach(System.out::println);
@Query এর সুবিধা
- জটিল কুয়েরি সহজে লেখা যায়।
- কোড আরও কাস্টমাইজড এবং অ্যাপ্লিকেশন লজিক অনুযায়ী ফ্লেক্সিবল হয়।
- Native SQL এবং JPQL উভয়কেই সাপোর্ট করে।
@Query এর সীমাবদ্ধতা
- বড় এবং জটিল কুয়েরির ক্ষেত্রে মেইনটেনেন্স কঠিন হতে পারে।
- ডাইনামিক কুয়েরির জন্য Criteria API বা Specification ব্যবহার করতে হতে পারে।
- Native Query এর ক্ষেত্রে ডাটাবেসের উপর নির্ভরশীলতা বৃদ্ধি পায়।
Read more